// Package _0_包含min函数的栈 main
// @Title _0_包含min函数的栈
// @Description  定义栈的数据结构，请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中，调用 min、push 及 pop 的时间复杂度都是 O(1)。
// @Author  == 琳琳也叫王木木 ==  2022-01-13 9:19
// @Create  2022-01-13 9:19
package main

import "fmt"

type MinStack struct {
	stackData []int // 保存数据的栈
	stackDrab []int // 单调栈
}

/**
思路1,用冗余的成员记录最小值，不过删除的时候可能会把最小值给删除了，所以需要重新判断

思路2： 使用两个栈，一个是原栈，一个是单调栈
*/

/** initialize your data structure here. */
func Constructor() MinStack {
	return MinStack{
		stackData: []int{},
		stackDrab: []int{},
	}
}

func (this *MinStack) Push(x int) {
	if len(this.stackData) == 0 {
		this.stackDrab = append(this.stackDrab, x)
	} else {
		if this.stackDrab[len(this.stackDrab)-1] < x {
			this.stackDrab = append(this.stackDrab, this.stackDrab[len(this.stackDrab)-1])
		} else {
			this.stackDrab = append(this.stackDrab, x)
		}
	}
	this.stackData = append(this.stackData, x)
}

func (this *MinStack) Pop() {
	this.stackData = this.stackData[:len(this.stackData)-1]
	this.stackDrab = this.stackDrab[:len(this.stackDrab)-1]
}

func (this *MinStack) Top() int {
	return this.stackData[len(this.stackData)-1]
}

func (this *MinStack) Min() int {
	return this.stackDrab[len(this.stackDrab)-1]
}

func main() {
	obj := Constructor()
	obj.Push(5)
	obj.Push(1)
	obj.Push(8)
	obj.Push(0)
	//obj.Pop();
	fmt.Println(obj.Top())
	fmt.Println(obj.Min())

}
